package cn.zwy.day3;

import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;

/**
* 对原有的删除指令的代码的改良
* @ClassName: RemoveAddZeroAdapterImprove 
* @Description: TODO
* @author zhaoweiyong  yyd 
* @date 2017年11月14日 下午3:15:19 *
*/
public class RemoveAddZeroAdapterImprove extends MethodVisitor {

    //上一条指令是iconst_0
    private boolean lastIconst0 = false;

    public RemoveAddZeroAdapterImprove(MethodVisitor mv) {
        super(Opcodes.ASM4, mv);
    }

    @Override
    public void visitInsn(int opcode) {
//         9: iconst_0
//        10: iadd
//        11: iconst_0
//        12: iadd
//        13: invokevirtual #21                 // Method java/io/PrintStream.println:(I)V
        
        // 如果上一条指令是iconst_0 && 当前指令是iadd
        if (lastIconst0 && Opcodes.IADD == opcode) {
            // 移除指令序列
            lastIconst0 = false;
            return;
            // 如果上一条指令是iconst_0
        } else if (lastIconst0) {
            mv.visitInsn(Opcodes.ICONST_0);
        }

        // 如果当前指令是iconst0
        if (Opcodes.ICONST_0 == opcode) {
            lastIconst0 = true;
            return;
        }
        lastIconst0 = false;
        // 访问当前指令
        mv.visitInsn(opcode);
    }

}
